library(tibble)
library(tidyr)
library(tidyquant) # To download the data
## Zorunlu paket yükleniyor: lubridate
## Zorunlu paket yükleniyor: timechange
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
## Zorunlu paket yükleniyor: PerformanceAnalytics
## Zorunlu paket yükleniyor: xts
## Zorunlu paket yükleniyor: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
## Zorunlu paket yükleniyor: quantmod
## Zorunlu paket yükleniyor: TTR
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(plotly) # To create interactive charts
## Zorunlu paket yükleniyor: ggplot2
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(timetk)
library(forcats)
symbols <- c("AKBNK.IS","AKSEN.IS","ARCLK.IS","ASELS.IS","BIMAS.IS","EKGYO.IS","EREGL.IS","FROTO.IS",
             "GARAN.IS",
"GUBRF.IS"  ,"HEKTS.IS","ISCTR.IS","KCHOL.IS","KOZAA.IS","KOZAL.IS","KRDMD.IS","PETKM.IS","PGSUS.IS",
"SAHOL.IS","SASA.IS","SISE.IS","TAVHL.IS","TCELL.IS","THYAO.IS","TKFEN.IS","TOASO.IS","TTKOM.IS","TUPRS.IS",
"VESTL.IS","YKBNK.IS")
prices <- quantmod::getSymbols(
  Symbols =symbols,
  src = "yahoo",
  from = "2020-01-01",
  auto.assign = TRUE,
  warnings = FALSE
) %>%
  # The map function takes an anonymous function and will return a list of five
  # The function Ad() extracts the daily adjusted price series
  purrr::map(.f = ~ quantmod::Ad(get(x = .x))) %>%
  # Use reduce() to merge the elements of .x interactively
  purrr::reduce(.f = merge) %>%
  # Use a replacement function to set column names to ticker symbols
  # This function is in prefix form
  # It is equivalent to colnames(x = prices) <- value
  `colnames<-`(value = symbols)
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
## pausing 1 second between requests for more than 5 symbols
# Keep only the last reading of each month
# We could have chosen to keep only the first reading of each month
asset_returns_xts <- xts::to.daily(
  x = prices,
  drop.time = TRUE,
  indexAt = "lastof",
  OHLC = FALSE
) %>%
  # Compute simple returns
  # Log returns are time-additive but not portfolio additive
  PerformanceAnalytics::Return.calculate(method = "discrete") %>%
  # Drop the first row since we lose 12/31/2012
  stats::na.omit()
# Keep only the xts returns, ticker symbols, and the prices series
rm(list = setdiff(x = ls(), y = c("symbols", "prices", "asset_returns_xts")))
# Visualize cumulative returns
chart.CumReturns(asset_returns_xts, main = "Cumulative returns of ETFs", legend.loc = "topleft")

mean_ret <- colMeans(asset_returns_xts)
print(round(mean_ret, 5))
## AKBNK.IS AKSEN.IS ARCLK.IS ASELS.IS BIMAS.IS EKGYO.IS EREGL.IS FROTO.IS 
##  0.00142  0.00493  0.00250  0.00240  0.00173  0.00267  0.00306  0.00321 
## GARAN.IS GUBRF.IS HEKTS.IS ISCTR.IS KCHOL.IS KOZAA.IS KOZAL.IS KRDMD.IS 
##  0.00156  0.00489  0.00684  0.00220  0.00207  0.00259  0.00278  0.00286 
## PETKM.IS PGSUS.IS SAHOL.IS  SASA.IS  SISE.IS TAVHL.IS TCELL.IS THYAO.IS 
##  0.00269  0.00279  0.00237  0.00579  0.00313  0.00200  0.00164  0.00335 
## TKFEN.IS TOASO.IS TTKOM.IS TUPRS.IS VESTL.IS YKBNK.IS 
##  0.00156  0.00306  0.00188  0.00214  0.00294  0.00253
cov_mat <- cov(asset_returns_xts) * 252

print(round(cov_mat,4))
##          AKBNK.IS AKSEN.IS ARCLK.IS ASELS.IS BIMAS.IS EKGYO.IS EREGL.IS
## AKBNK.IS   0.1776   0.0611   0.0636   0.0777   0.0479   0.1093   0.0702
## AKSEN.IS   0.0611   0.2314   0.0602   0.0748   0.0405   0.0878   0.0565
## ARCLK.IS   0.0636   0.0602   0.1392   0.0732   0.0381   0.0744   0.0686
## ASELS.IS   0.0777   0.0748   0.0732   0.1800   0.0454   0.0940   0.0819
## BIMAS.IS   0.0479   0.0405   0.0381   0.0454   0.1109   0.0542   0.0537
## EKGYO.IS   0.1093   0.0878   0.0744   0.0940   0.0542   0.2171   0.0727
## EREGL.IS   0.0702   0.0565   0.0686   0.0819   0.0537   0.0727   0.1734
## FROTO.IS   0.0625   0.0652   0.0860   0.0868   0.0463   0.0711   0.0774
## GARAN.IS   0.1545   0.0547   0.0547   0.0709   0.0372   0.0866   0.0594
## GUBRF.IS   0.0722   0.0662   0.0594   0.0968   0.0515   0.0889   0.0619
## HEKTS.IS   0.0660   0.0911   0.0519   0.0735   0.0385   0.0763   0.0491
## ISCTR.IS   0.1589   0.0562   0.0656   0.0774   0.0485   0.1104   0.0757
## KCHOL.IS   0.1037   0.0628   0.0846   0.0908   0.0567   0.0928   0.0870
## KOZAA.IS   0.0727   0.0796   0.0646   0.1022   0.0406   0.0970   0.0716
## KOZAL.IS   0.0547   0.0724   0.0573   0.0971   0.0384   0.0875   0.0691
## KRDMD.IS   0.0964   0.0847   0.0822   0.1037   0.0501   0.1025   0.1325
## PETKM.IS   0.0721   0.0883   0.0705   0.0828   0.0482   0.0896   0.0849
## PGSUS.IS   0.0957   0.0776   0.0821   0.0959   0.0363   0.0971   0.0687
## SAHOL.IS   0.1109   0.0592   0.0719   0.0827   0.0540   0.0931   0.0793
## SASA.IS    0.0797   0.0880   0.0797   0.0941   0.0440   0.0871   0.0823
## SISE.IS    0.0802   0.0672   0.0733   0.0916   0.0476   0.0915   0.0827
## TAVHL.IS   0.0812   0.0665   0.0753   0.0869   0.0443   0.0874   0.0703
## TCELL.IS   0.0693   0.0398   0.0584   0.0741   0.0463   0.0646   0.0624
## THYAO.IS   0.0893   0.0758   0.0816   0.0940   0.0455   0.0956   0.0836
## TKFEN.IS   0.0725   0.0672   0.0647   0.0827   0.0450   0.0930   0.0684
## TOASO.IS   0.0671   0.0668   0.0815   0.0874   0.0468   0.0802   0.0799
## TTKOM.IS   0.0947   0.0679   0.0727   0.0992   0.0460   0.0971   0.0776
## TUPRS.IS   0.0738   0.0738   0.0670   0.0858   0.0454   0.0769   0.0781
## VESTL.IS   0.0611   0.0795   0.0779   0.0903   0.0433   0.0836   0.0672
## YKBNK.IS   0.1634   0.0695   0.0706   0.0793   0.0526   0.1125   0.0766
##          FROTO.IS GARAN.IS GUBRF.IS HEKTS.IS ISCTR.IS KCHOL.IS KOZAA.IS
## AKBNK.IS   0.0625   0.1545   0.0722   0.0660   0.1589   0.1037   0.0727
## AKSEN.IS   0.0652   0.0547   0.0662   0.0911   0.0562   0.0628   0.0796
## ARCLK.IS   0.0860   0.0547   0.0594   0.0519   0.0656   0.0846   0.0646
## ASELS.IS   0.0868   0.0709   0.0968   0.0735   0.0774   0.0908   0.1022
## BIMAS.IS   0.0463   0.0372   0.0515   0.0385   0.0485   0.0567   0.0406
## EKGYO.IS   0.0711   0.0866   0.0889   0.0763   0.1104   0.0928   0.0970
## EREGL.IS   0.0774   0.0594   0.0619   0.0491   0.0757   0.0870   0.0716
## FROTO.IS   0.2328   0.0492   0.0678   0.0662   0.0635   0.0954   0.0719
## GARAN.IS   0.0492   0.1853   0.0574   0.0543   0.1443   0.0934   0.0620
## GUBRF.IS   0.0678   0.0574   0.3164   0.1001   0.0681   0.0793   0.1042
## HEKTS.IS   0.0662   0.0543   0.1001   0.3962   0.0649   0.0611   0.0908
## ISCTR.IS   0.0635   0.1443   0.0681   0.0649   0.1883   0.1057   0.0726
## KCHOL.IS   0.0954   0.0934   0.0793   0.0611   0.1057   0.1528   0.0863
## KOZAA.IS   0.0719   0.0620   0.1042   0.0908   0.0726   0.0863   0.2374
## KOZAL.IS   0.0706   0.0452   0.0851   0.0871   0.0594   0.0771   0.1883
## KRDMD.IS   0.0924   0.0873   0.0813   0.0687   0.1006   0.1015   0.0975
## PETKM.IS   0.0801   0.0569   0.0804   0.0639   0.0763   0.0867   0.0854
## PGSUS.IS   0.0795   0.0889   0.0852   0.0822   0.0958   0.1128   0.0876
## SAHOL.IS   0.0763   0.1006   0.0724   0.0561   0.1113   0.1127   0.0764
## SASA.IS    0.0939   0.0677   0.1031   0.1373   0.0764   0.1002   0.1049
## SISE.IS    0.0788   0.0678   0.0745   0.0630   0.0830   0.0904   0.0883
## TAVHL.IS   0.0819   0.0710   0.0746   0.0745   0.0800   0.1008   0.0783
## TCELL.IS   0.0627   0.0547   0.0656   0.0508   0.0682   0.0729   0.0702
## THYAO.IS   0.0842   0.0790   0.0883   0.0731   0.0905   0.1077   0.0810
## TKFEN.IS   0.0708   0.0593   0.0736   0.0657   0.0706   0.0838   0.0797
## TOASO.IS   0.1244   0.0568   0.0781   0.0796   0.0708   0.0934   0.0844
## TTKOM.IS   0.0739   0.0829   0.0887   0.0748   0.0894   0.0938   0.1009
## TUPRS.IS   0.0804   0.0670   0.0736   0.0541   0.0748   0.0926   0.0875
## VESTL.IS   0.0714   0.0483   0.0848   0.0702   0.0634   0.0746   0.0893
## YKBNK.IS   0.0668   0.1504   0.0764   0.0693   0.1658   0.1076   0.0751
##          KOZAL.IS KRDMD.IS PETKM.IS PGSUS.IS SAHOL.IS SASA.IS SISE.IS TAVHL.IS
## AKBNK.IS   0.0547   0.0964   0.0721   0.0957   0.1109  0.0797  0.0802   0.0812
## AKSEN.IS   0.0724   0.0847   0.0883   0.0776   0.0592  0.0880  0.0672   0.0665
## ARCLK.IS   0.0573   0.0822   0.0705   0.0821   0.0719  0.0797  0.0733   0.0753
## ASELS.IS   0.0971   0.1037   0.0828   0.0959   0.0827  0.0941  0.0916   0.0869
## BIMAS.IS   0.0384   0.0501   0.0482   0.0363   0.0540  0.0440  0.0476   0.0443
## EKGYO.IS   0.0875   0.1025   0.0896   0.0971   0.0931  0.0871  0.0915   0.0874
## EREGL.IS   0.0691   0.1325   0.0849   0.0687   0.0793  0.0823  0.0827   0.0703
## FROTO.IS   0.0706   0.0924   0.0801   0.0795   0.0763  0.0939  0.0788   0.0819
## GARAN.IS   0.0452   0.0873   0.0569   0.0889   0.1006  0.0677  0.0678   0.0710
## GUBRF.IS   0.0851   0.0813   0.0804   0.0852   0.0724  0.1031  0.0745   0.0746
## HEKTS.IS   0.0871   0.0687   0.0639   0.0822   0.0561  0.1373  0.0630   0.0745
## ISCTR.IS   0.0594   0.1006   0.0763   0.0958   0.1113  0.0764  0.0830   0.0800
## KCHOL.IS   0.0771   0.1015   0.0867   0.1128   0.1127  0.1002  0.0904   0.1008
## KOZAA.IS   0.1883   0.0975   0.0854   0.0876   0.0764  0.1049  0.0883   0.0783
## KOZAL.IS   0.2098   0.0872   0.0777   0.0764   0.0660  0.0897  0.0784   0.0698
## KRDMD.IS   0.0872   0.2354   0.1140   0.0997   0.0921  0.0900  0.1016   0.0895
## PETKM.IS   0.0777   0.1140   0.1955   0.0927   0.0807  0.0827  0.0907   0.0789
## PGSUS.IS   0.0764   0.0997   0.0927   0.3226   0.0955  0.1110  0.0971   0.1912
## SAHOL.IS   0.0660   0.0921   0.0807   0.0955   0.1413  0.0766  0.0844   0.0852
## SASA.IS    0.0897   0.0900   0.0827   0.1110   0.0766  0.3607  0.0886   0.0915
## SISE.IS    0.0784   0.1016   0.0907   0.0971   0.0844  0.0886  0.1599   0.0941
## TAVHL.IS   0.0698   0.0895   0.0789   0.1912   0.0852  0.0915  0.0941   0.2121
## TCELL.IS   0.0627   0.0661   0.0624   0.0578   0.0691  0.0576  0.0659   0.0582
## THYAO.IS   0.0699   0.0993   0.0986   0.1929   0.0956  0.0989  0.0984   0.1579
## TKFEN.IS   0.0692   0.0847   0.0884   0.0919   0.0801  0.0884  0.0864   0.0909
## TOASO.IS   0.0729   0.0895   0.0737   0.0839   0.0767  0.1064  0.0796   0.0787
## TTKOM.IS   0.0838   0.0981   0.0830   0.0927   0.0928  0.0838  0.0862   0.0828
## TUPRS.IS   0.0764   0.0978   0.1069   0.1034   0.0839  0.0799  0.0872   0.0923
## VESTL.IS   0.0810   0.0903   0.0719   0.0956   0.0694  0.0982  0.0843   0.0770
## YKBNK.IS   0.0576   0.1046   0.0882   0.0910   0.1150  0.0803  0.0828   0.0839
##          TCELL.IS THYAO.IS TKFEN.IS TOASO.IS TTKOM.IS TUPRS.IS VESTL.IS
## AKBNK.IS   0.0693   0.0893   0.0725   0.0671   0.0947   0.0738   0.0611
## AKSEN.IS   0.0398   0.0758   0.0672   0.0668   0.0679   0.0738   0.0795
## ARCLK.IS   0.0584   0.0816   0.0647   0.0815   0.0727   0.0670   0.0779
## ASELS.IS   0.0741   0.0940   0.0827   0.0874   0.0992   0.0858   0.0903
## BIMAS.IS   0.0463   0.0455   0.0450   0.0468   0.0460   0.0454   0.0433
## EKGYO.IS   0.0646   0.0956   0.0930   0.0802   0.0971   0.0769   0.0836
## EREGL.IS   0.0624   0.0836   0.0684   0.0799   0.0776   0.0781   0.0672
## FROTO.IS   0.0627   0.0842   0.0708   0.1244   0.0739   0.0804   0.0714
## GARAN.IS   0.0547   0.0790   0.0593   0.0568   0.0829   0.0670   0.0483
## GUBRF.IS   0.0656   0.0883   0.0736   0.0781   0.0887   0.0736   0.0848
## HEKTS.IS   0.0508   0.0731   0.0657   0.0796   0.0748   0.0541   0.0702
## ISCTR.IS   0.0682   0.0905   0.0706   0.0708   0.0894   0.0748   0.0634
## KCHOL.IS   0.0729   0.1077   0.0838   0.0934   0.0938   0.0926   0.0746
## KOZAA.IS   0.0702   0.0810   0.0797   0.0844   0.1009   0.0875   0.0893
## KOZAL.IS   0.0627   0.0699   0.0692   0.0729   0.0838   0.0764   0.0810
## KRDMD.IS   0.0661   0.0993   0.0847   0.0895   0.0981   0.0978   0.0903
## PETKM.IS   0.0624   0.0986   0.0884   0.0737   0.0830   0.1069   0.0719
## PGSUS.IS   0.0578   0.1929   0.0919   0.0839   0.0927   0.1034   0.0956
## SAHOL.IS   0.0691   0.0956   0.0801   0.0767   0.0928   0.0839   0.0694
## SASA.IS    0.0576   0.0989   0.0884   0.1064   0.0838   0.0799   0.0982
## SISE.IS    0.0659   0.0984   0.0864   0.0796   0.0862   0.0872   0.0843
## TAVHL.IS   0.0582   0.1579   0.0909   0.0787   0.0828   0.0923   0.0770
## TCELL.IS   0.1340   0.0658   0.0668   0.0575   0.0943   0.0608   0.0583
## THYAO.IS   0.0658   0.2002   0.0971   0.0876   0.0910   0.1029   0.0893
## TKFEN.IS   0.0668   0.0971   0.1645   0.0779   0.0845   0.0713   0.0782
## TOASO.IS   0.0575   0.0876   0.0779   0.1880   0.0786   0.0763   0.0811
## TTKOM.IS   0.0943   0.0910   0.0845   0.0786   0.1716   0.0796   0.0821
## TUPRS.IS   0.0608   0.1029   0.0713   0.0763   0.0796   0.1667   0.0674
## VESTL.IS   0.0583   0.0893   0.0782   0.0811   0.0821   0.0674   0.1942
## YKBNK.IS   0.0642   0.0899   0.0795   0.0774   0.0944   0.0775   0.0604
##          YKBNK.IS
## AKBNK.IS   0.1634
## AKSEN.IS   0.0695
## ARCLK.IS   0.0706
## ASELS.IS   0.0793
## BIMAS.IS   0.0526
## EKGYO.IS   0.1125
## EREGL.IS   0.0766
## FROTO.IS   0.0668
## GARAN.IS   0.1504
## GUBRF.IS   0.0764
## HEKTS.IS   0.0693
## ISCTR.IS   0.1658
## KCHOL.IS   0.1076
## KOZAA.IS   0.0751
## KOZAL.IS   0.0576
## KRDMD.IS   0.1046
## PETKM.IS   0.0882
## PGSUS.IS   0.0910
## SAHOL.IS   0.1150
## SASA.IS    0.0803
## SISE.IS    0.0828
## TAVHL.IS   0.0839
## TCELL.IS   0.0642
## THYAO.IS   0.0899
## TKFEN.IS   0.0795
## TOASO.IS   0.0774
## TTKOM.IS   0.0944
## TUPRS.IS   0.0775
## VESTL.IS   0.0604
## YKBNK.IS   0.2040
# Visualize cumulative returns
chart.CumReturns(asset_returns_xts, main = "Cumulative returns of ETFs", legend.loc = "topleft")

wts <- runif(n = length(symbols))
print(wts)
##  [1] 0.62929554 0.12115758 0.41081475 0.59875396 0.70667320 0.49918052
##  [7] 0.08624367 0.08712992 0.29052049 0.49581808 0.10099747 0.79278362
## [13] 0.17590865 0.95954451 0.23290811 0.88742730 0.80858684 0.80740807
## [19] 0.45912224 0.08194936 0.97471197 0.60145936 0.72198195 0.12346464
## [25] 0.22679494 0.71014970 0.11049605 0.45550525 0.89170069 0.73254283
print(sum(wts))
## [1] 14.78103
wts <- wts/sum(wts)
print(wts)
##  [1] 0.042574536 0.008196829 0.027793375 0.040508267 0.047809465 0.033771698
##  [7] 0.005834753 0.005894712 0.019654954 0.033544215 0.006832911 0.053635204
## [13] 0.011900973 0.064917291 0.015757230 0.060038253 0.054704359 0.054624610
## [19] 0.031061584 0.005544225 0.065943434 0.040691299 0.048845167 0.008352911
## [25] 0.015343648 0.048044665 0.007475531 0.030816879 0.060327366 0.049559657
sum(wts)
## [1] 1
port_returns <- (sum(wts * mean_ret) + 1)^252 - 1
port_risk <- sqrt(t(wts) %*% (cov_mat %*% wts))
print(port_risk)
##           [,1]
## [1,] 0.2940868
# Since Risk free rate is 0% 

sharpe_ratio <- port_returns/port_risk
print(sharpe_ratio)
##          [,1]
## [1,] 3.140113
# Calculate the random weights
wts <- runif(n = length(symbols))
wts <- wts/sum(wts)

# Calculate the portfolio returns
port_returns <- (sum(wts * mean_ret) + 1)^252 - 1

# Calculate the portfolio risk
port_risk <- sqrt(t(wts) %*% (cov_mat %*% wts))

# Calculate the Sharpe Ratio
sharpe_ratio <- port_returns/port_risk

print(wts)
##  [1] 0.0188110231 0.0145017473 0.0410073223 0.0434455563 0.0225632466
##  [6] 0.0539190170 0.0799638514 0.0228088505 0.0284690200 0.0132920548
## [11] 0.0036945388 0.0655912384 0.0167154193 0.0223911918 0.0516605642
## [16] 0.0004851297 0.0482595685 0.0658391929 0.0241475004 0.0246213456
## [21] 0.0415675904 0.0750848111 0.0105217971 0.0188211239 0.0718948453
## [26] 0.0162671793 0.0063193418 0.0281671072 0.0466090885 0.0225597365
print(port_returns)
## [1] 0.9354943
print(port_risk)
##           [,1]
## [1,] 0.2953227
print(sharpe_ratio)
##          [,1]
## [1,] 3.167702
num_port <- 50000

# Creating a matrix to store the weights

all_wts <- matrix(nrow = num_port,
                  ncol = length(symbols))

# Creating an empty vector to store
# Portfolio returns

port_returns <- vector('numeric', length = num_port)

# Creating an empty vector to store
# Portfolio Standard deviation

port_risk <- vector('numeric', length = num_port)

# Creating an empty vector to store
# Portfolio Sharpe Ratio

sharpe_ratio <- vector('numeric', length = num_port)

for (i in seq_along(port_returns)) {
  
  wts <- runif(length(symbols))
  wts <- wts/sum(wts)
  
  # Storing weight in the matrix
  all_wts[i,] <- wts
  
  # Portfolio returns
  
  port_ret <- sum(wts * mean_ret)
  port_ret <- ((port_ret + 1)^252) - 1
  
  # Storing Portfolio Returns values
  port_returns[i] <- port_ret
  
  
  # Creating and storing portfolio risk
  port_sd <- sqrt(t(wts) %*% (cov_mat  %*% wts))
  port_risk[i] <- port_sd
  
  # Creating and storing Portfolio Sharpe Ratios
  # Assuming 0% Risk free rate
  
  sr <- port_ret/port_sd
  sharpe_ratio[i] <- sr
  
}

# Storing the values in the table
portfolio_values <- tibble(Return = port_returns,
                           Risk = port_risk,
                           SharpeRatio = sharpe_ratio)


# Converting matrix to a tibble and changing column names
all_wts <- tk_tbl(all_wts)
## Warning in tk_tbl.data.frame(as.data.frame(data), preserve_index,
## rename_index, : Warning: No index to preserve. Object otherwise converted to
## tibble successfully.
colnames(all_wts) <- colnames(asset_returns_xts)

# Combing all the values together
portfolio_values <- tk_tbl(cbind(all_wts, portfolio_values))
## Warning in tk_tbl.data.frame(cbind(all_wts, portfolio_values)): Warning: No
## index to preserve. Object otherwise converted to tibble successfully.
head(portfolio_values)
## # A tibble: 6 × 33
##   AKBNK.IS AKSEN.IS ARCLK.IS ASELS.IS BIMAS.IS EKGYO.IS EREGL.IS FROTO…¹ GARAN…²
##      <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>   <dbl>   <dbl>
## 1   0.0541  0.0216   0.0240    0.0470  0.0196    0.0437  0.0516   0.0210 0.0227 
## 2   0.0326  0.0165   0.0294    0.0198  0.0429    0.0276  0.0370   0.0554 0.0382 
## 3   0.0426  0.0424   0.00417   0.0365  0.00759   0.0228  0.00464  0.0470 0.0787 
## 4   0.0308  0.0203   0.0233    0.0547  0.00283   0.0477  0.0100   0.0443 0.0220 
## 5   0.0138  0.0482   0.0391    0.0284  0.0187    0.0752  0.00162  0.0667 0.00655
## 6   0.0403  0.00176  0.00201   0.0398  0.0418    0.0306  0.0271   0.0538 0.0687 
## # … with 24 more variables: GUBRF.IS <dbl>, HEKTS.IS <dbl>, ISCTR.IS <dbl>,
## #   KCHOL.IS <dbl>, KOZAA.IS <dbl>, KOZAL.IS <dbl>, KRDMD.IS <dbl>,
## #   PETKM.IS <dbl>, PGSUS.IS <dbl>, SAHOL.IS <dbl>, SASA.IS <dbl>,
## #   SISE.IS <dbl>, TAVHL.IS <dbl>, TCELL.IS <dbl>, THYAO.IS <dbl>,
## #   TKFEN.IS <dbl>, TOASO.IS <dbl>, TTKOM.IS <dbl>, TUPRS.IS <dbl>,
## #   VESTL.IS <dbl>, YKBNK.IS <dbl>, Return <dbl>, Risk <dbl>,
## #   SharpeRatio <dbl>, and abbreviated variable names ¹​FROTO.IS, ²​GARAN.IS
min_var <- portfolio_values[which.min(portfolio_values$Risk),]
max_sr <- portfolio_values[which.max(portfolio_values$SharpeRatio),]
min_var
## # A tibble: 1 × 33
##   AKBNK.IS AKSEN.IS ARCLK.IS ASELS.IS BIMAS.IS EKGYO.IS EREGL.IS FROTO…¹ GARAN…²
##      <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>   <dbl>   <dbl>
## 1  0.00979   0.0630   0.0657   0.0268   0.0687  0.00290   0.0535  0.0156  0.0683
## # … with 24 more variables: GUBRF.IS <dbl>, HEKTS.IS <dbl>, ISCTR.IS <dbl>,
## #   KCHOL.IS <dbl>, KOZAA.IS <dbl>, KOZAL.IS <dbl>, KRDMD.IS <dbl>,
## #   PETKM.IS <dbl>, PGSUS.IS <dbl>, SAHOL.IS <dbl>, SASA.IS <dbl>,
## #   SISE.IS <dbl>, TAVHL.IS <dbl>, TCELL.IS <dbl>, THYAO.IS <dbl>,
## #   TKFEN.IS <dbl>, TOASO.IS <dbl>, TTKOM.IS <dbl>, TUPRS.IS <dbl>,
## #   VESTL.IS <dbl>, YKBNK.IS <dbl>, Return <dbl>, Risk <dbl>,
## #   SharpeRatio <dbl>, and abbreviated variable names ¹​FROTO.IS, ²​GARAN.IS
p <- min_var %>%
  gather(AKBNK.IS:YKBNK.IS, key = Asset,
         value = Weights) %>%
  mutate(Asset = as.factor(Asset)) %>%
  ggplot(aes(x = fct_reorder(Asset,Weights), y = Weights, fill = Asset)) +
  geom_bar(stat = 'identity') +




theme_minimal() +
  labs(x = 'Assets', y = 'Weights', title = "Minimum Variance Portfolio Weights") +
  scale_y_continuous(labels = scales::percent) 

ggplotly(p)
max_sr
## # A tibble: 1 × 33
##   AKBNK.IS AKSEN.IS ARCLK.IS ASELS.IS BIMAS.IS EKGYO.IS EREGL.IS FROTO…¹ GARAN…²
##      <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>   <dbl>   <dbl>
## 1   0.0273   0.0656   0.0410   0.0527   0.0612   0.0161   0.0517 0.00345 0.00573
## # … with 24 more variables: GUBRF.IS <dbl>, HEKTS.IS <dbl>, ISCTR.IS <dbl>,
## #   KCHOL.IS <dbl>, KOZAA.IS <dbl>, KOZAL.IS <dbl>, KRDMD.IS <dbl>,
## #   PETKM.IS <dbl>, PGSUS.IS <dbl>, SAHOL.IS <dbl>, SASA.IS <dbl>,
## #   SISE.IS <dbl>, TAVHL.IS <dbl>, TCELL.IS <dbl>, THYAO.IS <dbl>,
## #   TKFEN.IS <dbl>, TOASO.IS <dbl>, TTKOM.IS <dbl>, TUPRS.IS <dbl>,
## #   VESTL.IS <dbl>, YKBNK.IS <dbl>, Return <dbl>, Risk <dbl>,
## #   SharpeRatio <dbl>, and abbreviated variable names ¹​FROTO.IS, ²​GARAN.IS
p <- max_sr %>%
  gather(AKBNK.IS:YKBNK.IS,  key = Asset,
         value = Weights) %>%
  mutate(Asset = as.factor(Asset)) %>%
  ggplot(aes(x = fct_reorder(Asset,Weights), y = Weights, fill = Asset)) +
  geom_bar(stat = 'identity') +
  theme_minimal() +
  labs(x = 'Assets', y = 'Weights', title = "Tangency Portfolio Weights") +
  scale_y_continuous(labels = scales::percent) 

ggplotly(p)
p <- portfolio_values %>%
  ggplot(aes(x = Risk, y = Return, color = SharpeRatio)) +
  geom_point() +
  theme_classic() +
  scale_y_continuous(labels = scales::percent) +
  scale_x_continuous(labels = scales::percent) +
  labs(x = 'Annualized Risk',
       y = 'Annualized Returns',
       title = "Portfolio Optimization & Efficient Frontier") +
  geom_point(aes(x = Risk,
                 y = Return), data = min_var, color = 'red') +
  geom_point(aes(x = Risk,
                 y = Return), data = max_sr, color = 'red') +
  annotate('text', x = 0.29, y =1.31 , label = "Tangency Portfolio") +
  annotate('text', x =0.27 , y =0.82 , label = "Minimum variance portfolio") +
  annotate(geom = 'segment', x =0.29 , xend = 0.29,  y =1.1 , 
           yend =1.10 , color = 'red', arrow = arrow(type = "open")) +
  annotate(geom = 'segment', x =0.50 , xend =0.50 ,  y =1.1 , 
           yend =1.10 , color = 'red', arrow = arrow(type = "open"))


ggplotly(p)